import { useUserStore } from '@/stores/user'

/**
 * OAuth登录处理工具
 */
export class OAuthLoginHandler {
	constructor() {
		this.userStore = useUserStore()
	}

	/**
	 * 检查并处理OAuth登录
	 * @returns {Promise<{success: boolean, code?: string, msg?: string, needAuth?: boolean}>}
	 */
	async handleLogin() {
		try {
			// 检查URL中是否有code参数
			const urlParams = new URLSearchParams(window.location.search)
			const code = urlParams.get('code')
			const openid = urlParams.get('openid')

			// 处理 openid 登录
			if (openid) {
				console.log('检测到OAuth openid，尝试登录...')
				const result = await this.userStore.loginWithOpenid(openid)

				// 清除URL中的openid参数
				this.clearCodeFromUrl()

				if (result.success) {
					console.log('Openid登录成功')
					return { success: true, data: result.data }
				} else if (result.code) {
					// 返回特殊状态码（50001/50002/50003）
					console.log('Openid登录返回特殊状态:', result.code)
					return {
						success: false,
						code: result.code,
						msg: result.msg,
						needSpecialHandle: true,
						data: result.data,
					}
				} else {
					console.error('Openid登录失败:', result.error)
					return { success: false, error: result.error }
				}
			}

			// 处理 code 登录
			if (code) {
				console.log('检测到OAuth code，尝试登录...')
				const result = await this.userStore.loginWithCode(code)

				// 清除URL中的code参数
				this.clearCodeFromUrl()

				if (result.success) {
					console.log('Code登录成功')
					return { success: true, data: result.data }
				} else if (result.code) {
					// 返回特殊状态码（50001/50002/50003）
					console.log('Code登录返回特殊状态:', result.code)
					return {
						success: false,
						code: result.code,
						msg: result.msg,
						needSpecialHandle: true,
						data: result.data,
					}
				} else {
					console.error('Code登录失败:', result.error)
					return { success: false, error: result.error }
				}
			}

			// 没有code，尝试用缓存 code 自动登录
			try {
				await this.userStore.ensureLogin()
				// 登录成功
				return { success: true, data: this.userStore.userInfo }
			} catch (e) {
				// code 过期或无效，需重新授权
				console.warn('code 过期或无效，需OAuth授权', e?.message)
				await this.redirectToAuth()
				return { success: false, needAuth: true }
			}
		} catch (error) {
			console.error('OAuth登录处理失败:', error)
			return { success: false, error: error.message }
		}
	}

	/**
	 * 跳转到OAuth授权页面
	 */
	async redirectToAuth() {
		try {
			await this.userStore.redirectToAuth()
		} catch (error) {
			console.error('跳转OAuth授权页面失败:', error)
			throw error
		}
	}

	/**
	 * 清除URL中的code/openid参数
	 */
	clearCodeFromUrl() {
		const url = new URL(window.location.href)
		url.searchParams.delete('code')
		url.searchParams.delete('openid')
		url.searchParams.delete('state') // 如果有state参数也清除
		window.history.replaceState({}, document.title, url.toString())
	}

	/**
	 * 绑定后自动用缓存 code 重试登录
	 */
	async retryLoginAfterBind() {
		if (this.userStore.code && this.userStore.codeTime && Date.now() - this.userStore.codeTime < 2 * 60 * 1000) {
			// code 仍有效，重试登录
			const result = await this.userStore.loginWithCode(this.userStore.code)
			return result
		} else {
			// code 过期，需重新授权
			await this.redirectToAuth()
			return { success: false, needAuth: true }
		}
	}

	/**
	 * 检查状态码是否需要特殊处理
	 * @param {string} code
	 * @returns {boolean}
	 */
	needSpecialHandle(code) {
		return ['50001', '50002', '50003'].includes(code)
	}

	/**
	 * 获取状态码对应的处理方式
	 * @param {string} code
	 * @returns {{canBind: boolean, canRefresh: boolean, message: string}}
	 */
	getHandleType(code) {
		switch (code) {
			case '50001': // 未实名认证
				return {
					canBind: true,
					canRefresh: false,
					message: '您尚未进行实名制认证，请先完成企业绑定',
				}
			case '50002': // 待审核
				return {
					canBind: false,
					canRefresh: true,
					message: '您的实名制认证正在审核中，请耐心等待',
				}
			case '50003': // 审核未通过
				return {
					canBind: false,
					canRefresh: false,
					message: '您的实名制认证未通过审核，请联系管理员',
				}
			default:
				return {
					canBind: false,
					canRefresh: false,
					message: '未知状态',
				}
		}
	}
}

/**
 * 创建OAuth登录处理器实例
 */
export const createOAuthHandler = () => {
	return new OAuthLoginHandler()
}

/**
 * 在Vue组件中使用的组合式API
 */
export function useOAuthLogin() {
	const handler = new OAuthLoginHandler()

	return {
		handleLogin: () => handler.handleLogin(),
		redirectToAuth: () => handler.redirectToAuth(),
		needSpecialHandle: (code) => handler.needSpecialHandle(code),
		getHandleType: (code) => handler.getHandleType(code),
	}
}
